package com.dailywork.basepro.lambda;

import com.huazai.java8.pattern.Funcation01;
import com.huazai.java8.pattern.Funcation02;

import java.util.Comparator;
import java.util.function.Consumer;

/**
 * 深入 java8 第 02 篇 （ Lambda表达式基础语法 ）
 *
 * @author HuaZai(huazai @ aliyun.com)
 * <p>2018年4月14日 下午9:40:12 com.huazai.java8.lambda Java8-001
 */
public class Lambda02 {

    public void test01() {
        Runnable rb = () -> System.out.println("hello world");
        rb.run();
    }

    // 2.1.2 语法格式二：有一个参数，并且无返回值
    public void test02() {
        Consumer<String> cm = (e) -> System.out.println(e);
        cm.accept("hello world");
    }

    // 2.1.3 语法格式三：若只有一个参数，小括号可以省略不写
    public void test03() {
        Consumer<String> cm = e -> System.out.println(e);
        cm.accept("hello world");
    }

    // 2.1.4 语法格式四：有两个以上的参数，有返回值，并且 Lambda 体中有多条语句
    @SuppressWarnings("unused")
    public void test04() {
        Comparator<Integer> cp =
                (x, y) -> {
                    // 模拟多条语句
                    System.out.println("hello world");
                    return Integer.compare(x, y);
                };
    }

    // 2.1.5 语法格式五：若 Lambda 体中只有一条语句， return 和 大括号都可以省略不写
    @SuppressWarnings("unused")
    public void test05() {
        Comparator<Integer> cp = (x, y) -> Integer.compare(x, y);
    }

    // 2.1.6 语法格式六：Lambda 表达式的参数列表的数据类型可以省略不写，因为JVM编译器通过上下文推断出，数据类型，即“类型推断”
    // 如语法五所示

    // 2.1.7 需求：实现对整数进行运算，需要先定义一个函数式接口 Funcation
    // 2.1.7.1 需求一：实现对一个整数进行加法运算
    public Integer operations01(Integer num, Funcation01 fun) {
        return fun.getValues(num);
    }

    public void test06() {
        Integer result = operations01(100, (x) -> x + x);
        System.out.println(result);
    }

    // 2.1.7.2 需求二：实现对两个整数进行加法运算
    public Integer operations02(Integer num01, Integer num02, Funcation02 fun) {
        return fun.getValues(num01, num02);
    }

    public void test07() {
        System.out.println(operations02(100, 200, (x, y) -> x + y));
    }
}
